<?php

namespace RX\Helpers;

use RX\Helpers\Arrays\ArrayHelper;
use Throwable;

class FormatHelper
{
    /**
     * 字节格式化
     *
     * @param int $size 字节
     *
     * @return string
     */
    public static function formatBytes(int $size)
    {
        $unit = ['b', 'kb', 'mb', 'gb', 'tb', 'pb'];
        return @round($size / pow(1024, ($i = floor(log($size, 1024)))), 2) . ' ' . $unit[$i];
    }

    /**
     * 金额格式化
     *
     * @param $number
     * @param $decimals
     *
     * @return string
     */
    public static function formatNumbers($number, $decimals)
    {
        return sprintf("%.{$decimals}f", $number);
    }


    /**
     * 数字金额转换为中文
     *
     * @param double $num 数字
     * @param bool $sim 大小写
     *
     * @return string
     */
    public static function numberToChinese($num, $sim = false)
    {
        if (!is_numeric($num)) {
            return '含有非数字非小数点字符！';
        }
        $char   = $sim ? [
            '零',
            '一',
            '二',
            '三',
            '四',
            '五',
            '六',
            '七',
            '八',
            '九',
        ] : [
            '零',
            '壹',
            '贰',
            '叁',
            '肆',
            '伍',
            '陆',
            '柒',
            '捌',
            '玖',
        ];
        $unit   = $sim ? ['', '十', '百', '千', '', '万', '亿', '兆'] : ['', '拾', '佰', '仟', '', '萬', '億', '兆'];
        $retval = '';
        $num    = sprintf("%01.2f", $num);
        [$num, $dec] = explode('.', $num);
        // 小数部分
        if ($dec['0'] > 0) {
            $retval .= "{$char[$dec['0']]}角";
        }
        if ($dec['1'] > 0) {
            $retval .= "{$char[$dec['1']]}分";
        }
        // 整数部分
        if ($num > 0) {
            $retval = "元" . $retval;
            $f      = 1;
            $out    = [];
            $str    = strrev(intval($num));
            for ($i = 0, $c = strlen($str); $i < $c; $i++) {
                if ($str[$i] > 0) {
                    $f = 0;
                }
                if ($f == 1 && $str[$i] == 0) {
                    $out[$i] = "";
                } else {
                    $out[$i] = $char[$str[$i]];
                }
                $out[$i] .= $str[$i] != '0' ? $unit[$i % 4] : '';
                if ($i > 1 and $str[$i] + $str[$i - 1] == 0) {
                    $out[$i] = '';
                }
                if ($i % 4 == 0) {
                    $out[$i] .= $unit[4 + floor($i / 4)];
                }
            }
            $retval = join('', array_reverse($out)) . $retval;
        }
        return $retval;
    }


    /**
     * 影藏手机号
     *
     * @param string $mobile
     *
     * @return string|string[]
     */
    public static function hideMobile(string $mobile): string
    {
        return substr_replace($mobile, '****', 3, 4);
    }

    /**
     * 影藏身份证
     *
     * @param string $idCard
     * @return string|string[]
     */
    public static function hideCard(string $idCard): string
    {
        return strlen($idCard) == 15 ? substr_replace($idCard, "*****", 6, 5) : (strlen($idCard) == 18 ? substr_replace($idCard, "********", 6, 8) : $idCard);
    }


    /**
     * 格式化异常信息
     * @param Throwable $throwable 异常
     * @return string
     */
    public static function formatThrowable(Throwable $throwable): string
    {
        return sprintf(
            "%s:%s(%s) in %s:%s\nStack trace:\n%s",
            get_class($throwable),
            $throwable->getMessage(),
            $throwable->getCode(),
            $throwable->getFile(),
            $throwable->getLine(),
            $throwable->getTraceAsString()
        );
    }
}
